package com.yunc.common.utils;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

import javax.imageio.ImageIO;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
 * Thumbnailator压缩图片
 *
 * @author congcong tao
 * @date 2018/2/7 13:34
 */
public class ThumbnailsUtil {

    /**
     * 按横或高的size缩小图片
     *       若图片横比原始横大，高比原始高大，图片按横或高比例缩小
     *       若图片横比原始横小，高比原始高大，高缩小，图片比例不变
     *       若图片横比原始横大，高比原始高小，横缩小，图片比例不变
     * @param fromUrl 原始路径
     * @param toUrl 输出路径
     * @param width 宽度
     * @param height 高度
     * @author congcong tao
     * @date 2018/2/7 13:39
     */
    public static void autoSize(String fromUrl, String toUrl, int width, int height){
        try {
            Thumbnails.of(fromUrl).size(width, height).toFile(toUrl);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static byte[] autoSize(InputStream inputStream, int width, int height){
        try {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            Thumbnails.of(inputStream).size(width, height).toOutputStream(outputStream);
            return outputStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 按比例压缩
     * @param fromUrl 原始路径
     * @param toUrl 输出路径
     * @param d 比例
     * @author congcong tao
     * @date 2018/2/7 13:53
     */
    public static void scale(String fromUrl, String toUrl, Double d){
        try {
            Thumbnails.of(fromUrl).scale(d).toFile(toUrl);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 按指定大小进行缩放
     * @param fromUrl 原始路径
     * @param toUrl 输出路径
     * @param width 宽度
     * @param height 高度
     * @author congcong tao
     * @date 2018/2/7 13:57
     */
    public static void keepSize(String fromUrl, String toUrl, int width, int height){
        try {
            Thumbnails.of(fromUrl).size(width, height).keepAspectRatio(false).toFile(toUrl);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 按角度旋转图片
     *        正数：顺时针
     *        负数：逆时针
     * @param fromUrl 原始路径
     * @param toUrl 输出路径
     * @param width 宽度
     * @param height 高度
     * @param rotate rotate(角度),正数：顺时针 负数：逆时针
     * @author congcong tao
     * @date 2018/2/7 14:01
     */
    public static void rotate(String fromUrl, String toUrl, int width, int height, double rotate){
        try {
            Thumbnails.of(fromUrl).size(width, height).rotate(rotate).toFile(toUrl);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 水印
     *    位置watermark方法中Positions.BOTTOM_RIGHT是enum
     * @param fromUrl 原始路径
     * @param toUrl 输出路径
     * @param scale 比例
     * @param watermarkUrl 水印图路径
     * @param adj 透明度
     * @author congcong tao
     * @date 2018/2/7 14:21
     */
    public static void watermark(String fromUrl, String toUrl, double scale, String watermarkUrl, float adj){
        try {
            Thumbnails.of(fromUrl).scale(scale).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(watermarkUrl)), adj).toFile(toUrl);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 裁剪
     * @param fromUrl 原始路径
     * @param toUrl 输出路径
     * @param scale 比例
     * @param regionX 裁剪x轴像素
     * @param regionY 裁剪y轴像素
     * @param regionHeight 裁剪高度
     * @param regionWidth 裁剪宽度
     * @author congcong tao
     * @date 2018/2/7 15:20
     */
    public static void sourceRegion(String fromUrl, String toUrl, double scale, int regionX, int regionY, int regionHeight, int regionWidth){
        try {
            Thumbnails.of(fromUrl).scale(scale).sourceRegion(regionX, regionY, regionHeight, regionWidth).toFile(toUrl);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
